#!/usr/bin/env node

import fs from 'fs';
import path from 'path';
import { exec } from 'child_process';
import { promisify } from 'util';
import os from 'os';

const execAsync = promisify(exec);

console.log('🔐 Network Firewall 证书安装工具');
console.log('=====================================\n');

const certPath = path.join(process.cwd(), 'certs');
const rootCertPath = path.join(certPath, 'root-cert.pem');

async function checkCertificateExists() {
  if (!fs.existsSync(rootCertPath)) {
    console.log('❌ 根证书文件不存在');
    console.log('💡 请先启动应用生成根证书，然后再运行此脚本');
    console.log(`📁 证书路径: ${rootCertPath}`);
    return false;
  }
  
  console.log('✅ 找到根证书文件');
  console.log(`📁 证书路径: ${rootCertPath}`);
  return true;
}

async function installWindowsCertificate() {
  try {
    console.log('🔧 正在安装Windows根证书...');
    
    // 使用certlm.msc安装到本地计算机的受信任根证书颁发机构
    const command = `certutil -addstore -f "Root" "${rootCertPath}"`;
    
    console.log('💡 需要管理员权限来安装证书到系统存储');
    console.log(`🔧 执行命令: ${command}`);
    
    const { stdout, stderr } = await execAsync(command);
    
    if (stderr && !stderr.includes('命令成功完成')) {
      console.log('⚠️ 安装过程中有警告:', stderr);
    }
    
    console.log('✅ Windows根证书安装完成');
    console.log('💡 证书已安装到"受信任的根证书颁发机构"');
    
    return true;
  } catch (error) {
    console.error('❌ Windows证书安装失败:', error.message);
    console.log('\n🔧 手动安装步骤:');
    console.log('1. 以管理员身份打开命令提示符');
    console.log(`2. 运行: certutil -addstore -f "Root" "${rootCertPath}"`);
    console.log('3. 或者双击证书文件，选择"安装证书"');
    console.log('4. 选择"本地计算机" -> "受信任的根证书颁发机构"');
    
    return false;
  }
}

async function installMacOSCertificate() {
  try {
    console.log('🔧 正在安装macOS根证书...');
    
    // 使用security命令安装证书
    const command = `security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "${rootCertPath}"`;
    
    console.log('💡 需要管理员权限来安装证书到系统钥匙串');
    console.log(`🔧 执行命令: ${command}`);
    
    const { stdout, stderr } = await execAsync(command);
    
    console.log('✅ macOS根证书安装完成');
    console.log('💡 证书已安装到系统钥匙串');
    
    return true;
  } catch (error) {
    console.error('❌ macOS证书安装失败:', error.message);
    console.log('\n🔧 手动安装步骤:');
    console.log('1. 双击证书文件打开"钥匙串访问"');
    console.log('2. 将证书拖拽到"系统"钥匙串');
    console.log('3. 双击证书，展开"信任"选项');
    console.log('4. 将"使用此证书时"设置为"始终信任"');
    
    return false;
  }
}

async function installLinuxCertificate() {
  try {
    console.log('🔧 正在安装Linux根证书...');
    
    // 复制证书到系统证书目录
    const certDir = '/usr/local/share/ca-certificates';
    const destPath = path.join(certDir, 'network-firewall-root.crt');
    
    // 转换PEM到CRT格式
    await execAsync(`cp "${rootCertPath}" "${destPath}"`);
    
    // 更新证书存储
    await execAsync('update-ca-certificates');
    
    console.log('✅ Linux根证书安装完成');
    console.log('💡 证书已添加到系统CA存储');
    
    return true;
  } catch (error) {
    console.error('❌ Linux证书安装失败:', error.message);
    console.log('\n🔧 手动安装步骤:');
    console.log(`1. sudo cp "${rootCertPath}" /usr/local/share/ca-certificates/network-firewall-root.crt`);
    console.log('2. sudo update-ca-certificates');
    console.log('\n或者对于Firefox:');
    console.log('1. 打开Firefox设置 -> 隐私与安全 -> 证书');
    console.log('2. 点击"查看证书" -> "证书颁发机构"');
    console.log('3. 点击"导入"并选择证书文件');
    
    return false;
  }
}

async function verifyCertificateInstallation() {
  console.log('\n🔍 验证证书安装...');
  
  const platform = os.platform();
  
  try {
    if (platform === 'win32') {
      // 在Windows上验证证书
      const { stdout } = await execAsync('certutil -store Root | findstr "Network Firewall"');
      if (stdout.includes('Network Firewall')) {
        console.log('✅ Windows证书验证成功');
        return true;
      }
    } else if (platform === 'darwin') {
      // 在macOS上验证证书
      const { stdout } = await execAsync('security find-certificate -c "Network Firewall Root CA" /Library/Keychains/System.keychain');
      if (stdout.includes('Network Firewall Root CA')) {
        console.log('✅ macOS证书验证成功');
        return true;
      }
    } else {
      // Linux验证较复杂，简单检查文件是否存在
      if (fs.existsSync('/usr/local/share/ca-certificates/network-firewall-root.crt')) {
        console.log('✅ Linux证书文件验证成功');
        return true;
      }
    }
  } catch (error) {
    console.log('⚠️ 证书验证失败，但这不一定意味着安装失败');
  }
  
  return false;
}

async function main() {
  try {
    // 检查证书文件是否存在
    if (!(await checkCertificateExists())) {
      process.exit(1);
    }
    
    const platform = os.platform();
    console.log(`🖥️ 检测到系统: ${platform}\n`);
    
    let success = false;
    
    if (platform === 'win32') {
      success = await installWindowsCertificate();
    } else if (platform === 'darwin') {
      success = await installMacOSCertificate();
    } else if (platform === 'linux') {
      success = await installLinuxCertificate();
    } else {
      console.log('❌ 不支持的操作系统');
      console.log('💡 请手动安装根证书');
    }
    
    if (success) {
      await verifyCertificateInstallation();
      
      console.log('\n🎉 证书安装完成！');
      console.log('\n💡 重要提示:');
      console.log('1. 重启浏览器以使证书生效');
      console.log('2. 某些应用可能需要重启');
      console.log('3. 如果仍有SSL错误，请检查证书是否正确安装');
      console.log('\n🔒 现在可以启用HTTPS拦截功能了！');
    } else {
      console.log('\n❌ 自动安装失败，请按照上述手动步骤安装证书');
    }
    
  } catch (error) {
    console.error('❌ 证书安装过程中发生错误:', error);
    process.exit(1);
  }
}

// 处理Ctrl+C
process.on('SIGINT', () => {
  console.log('\n👋 证书安装工具已退出');
  process.exit(0);
});

main(); 